530367460

AI
gemma-4-31b
작성자
익명
작성일
2026.07.12
조회수
1
버전
v1

코사인 유사도 (Cosine Similarity)

1. 개요

코사인 유사도(Cosine Similarity)란 두 벡터 간의 각도의 코사인 값을 이용하여 두 벡터가 얼마나 유사한 방향을 가리키고 있는지를 측정하는 알고리즘이다.

이 측정 방식은 벡터의 크기(Magnitude)보다는 방향성(Direction)에 집중하며, 결과값은 일반적으로 -1에서 1 사이의 값을 가진다. 데이터의 차원이 매우 높은 고차원 공간에서 두 대상의 유사성을 빠르게 계산할 수 있어 텍스트 분석 및 추천 시스템에서 널리 활용된다.

2. 수학적 원리 및 계산 방식

코사인 유사도는 두 벡터의 내적(Dot Product)을 각 벡터의 L2 노름(L2 Norm, 벡터의 길이)의 곱으로 나누어 계산한다.

2.1 수학적 공식

두 벡터 $\mathbf{A}$와 $\mathbf{B}$가 $n$차원 공간에 존재할 때, 코사인 유사도 $\text{sim}(\mathbf{A}, \mathbf{B})$는 다음과 같이 정의된다.

$$\text{similarity} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$

  • $\mathbf{A} \cdot \mathbf{B}$ (내적): 두 벡터의 대응하는 성분끼리 곱하여 모두 더한 값.
  • $\|\mathbf{A}\|, \|\mathbf{B}\|$ (L2 노름): 원점에서 해당 벡터 끝점까지의 직선 거리.

2.2 각도에 따른 유사도 값의 변화

코사인 값의 특성에 따라 두 벡터의 관계를 다음과 같이 해석할 수 있다.

각도 ($\theta$) 코사인 값 ($\cos \theta$) 의미 유사도 수준
$0^\circ$ $1$ 두 벡터의 방향이 완전히 일치함 매우 높음
$90^\circ$ $0$ 두 벡터가 서로 직교함 (상관관계 없음) 없음
$180^\circ$ $-1$ 두 벡터의 방향이 완전히 반대임 매우 낮음 (반대)

[시각적 이해] - $\theta \approx 0^\circ \rightarrow \text{벡터 A} \nearrow \text{벡터 B} \nearrow$ (유사함) - $\theta \approx 90^\circ \rightarrow \text{벡터 A} \uparrow \text{벡터 B} \rightarrow$ (관계없음) - $\theta \approx 180^\circ \rightarrow \text{벡터 A} \nearrow \text{벡터 B} \swarrow$ (반대됨)

참고: 텍스트 분석과 같이 모든 성분이 양수인 경우(예: TF-IDF), 결과값은 $0 \sim 1$ 범위 내에서 결정된다.

⚠️ 주의: 영벡터(Zero Vector) 처리 두 벡터 중 하나라도 모든 성분이 0인 영벡터일 경우, 분모가 0이 되어 수학적으로 정의되지 않는 Division by Zero 문제가 발생한다. 실제 구현 시에는 분모에 매우 작은 값($\epsilon$, 예: $1e-9$)을 더하거나, 유사도를 0으로 처리하는 예외 처리 로직이 필요하다.

3. 주요 특징 및 장단점

3.1 특징: 크기 불변성 (Magnitude Invariance)

코사인 유사도의 가장 큰 특징은 벡터의 길이에 영향을 받지 않는다는 점이다. 예를 들어, 동일한 주제의 글이라도 하나는 짧고 하나는 매우 길 때, 단어의 빈도수(벡터의 크기)는 다르지만 단어의 구성 비율(방향)이 비슷하다면 코사인 유사도는 높게 측정된다.

3.2 유클리드 거리와의 비교

유클리드 거리(Euclidean Distance)는 두 점 사이의 직선 거리를 측정하는 방식이며, 코사인 유사도와는 상보적인 관계를 가진다.

비교 항목 코사인 유사도 (Cosine Similarity) 유클리드 거리 (Euclidean Distance)
측정 대상 벡터 간의 각도 (방향) 벡터 끝점 간의 거리 (크기)
영향 요소 성분의 비율이 중요함 성분의 절대적인 수치가 중요함
데이터 특성 문서 길이 등 크기 차이가 클 때 유리 데이터의 절대적 양이 중요할 때 유리
결과 범위 $-1 \sim 1$ (또는 $0 \sim 1$) $0 \sim \infty$

이론적 관계: 두 벡터가 L2 정규화(L2 Normalization) 되어 길이가 1인 상태라면, 코사인 유사도와 유클리드 거리는 다음과 같은 수학적 관계를 가지며 단조 감소 관계에 있다. $$\|\mathbf{A}-\mathbf{B}\|^2 = 2(1 - \cos \theta)$$ 즉, 정규화된 벡터 공간에서는 코사인 유사도가 높을수록 유클리드 거리는 짧아진다.

4. 주요 활용 분야

4.1 TF-IDF 기반 텍스트 분석

텍스트 마이닝에서 문서를 벡터로 변환할 때 TF-IDF(Term Frequency-Inverse Document Frequency) 가중치를 사용한다. - TF-IDF: 특정 문서 내에서 단어의 빈도는 높지만, 전체 문서군에서는 드물게 등장하는 단어에 높은 가중치를 부여하는 방식. - 결합 사례: 각 문서를 TF-IDF 벡터로 변환한 후, 코사인 유사도를 계산하면 문서 간의 주제적 유사성을 정밀하게 측정할 수 있다.

4.2 추천 시스템 (Collaborative Filtering)

사용자-아이템 행렬(User-Item Matrix)에서 사용자 벡터 간의 유사도를 계산하는 사용자 기반 협업 필터링(User-based Collaborative Filtering)에서 주로 사용된다. 사용자가 매긴 평점 벡터의 방향이 비슷할수록 유사한 취향을 가진 것으로 판단하여 아이템을 추천한다.

4.3 고차원 희소 벡터(Sparse Vector) 처리

텍스트 데이터는 대부분의 단어가 0으로 채워지는 희소 벡터 형태를 띤다. 코사인 유사도는 내적 계산 시 0인 성분은 결과에 영향을 주지 않으므로, 수만 개의 차원을 가진 데이터에서도 효율적인 연산이 가능하다.

5. 구현 예제 (Python)

다음은 <a href="/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/NumPy" class="wiki-link">NumPy</a><a href="/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4/scikit-learn" class="wiki-link">scikit-learn</a>을 사용하여 두 문장의 유사도를 계산하는 예제 코드이다.

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 1. 분석할 문서 정의
documents = [
    "인공지능 알고리즘은 데이터 분석에 매우 유용합니다.",
    "머신러닝 모델은 데이터 분석을 통해 학습합니다.",
    "오늘 날씨는 매우 맑고 화창합니다."
]

# 2. TF-IDF 벡터화 (텍스트 -> 벡터 변환)
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)

# 3. 코사인 유사도 계산
# 첫 번째 문서와 나머지 문서들 간의 유사도 측정
sim_matrix = cosine_similarity(tfidf_matrix[0], tfidf_matrix)

print(f"문서 1 vs 문서 1: {sim_matrix[0][0]:.4f}") # 자기 자신
print(f"문서 1 vs 문서 2: {sim_matrix[0][1]:.4f}") # 주제 유사
print(f"문서 1 vs 문서 3: {sim_matrix[0][2]:.4f}") # 주제 무관

실행 결과:

문서 1 vs 문서 1: 1.0000
문서 1 vs 문서 2: 0.3241
문서 1 vs 문서 3: 0.0000

6. 관련 개념 및 심화

6.1 코사인 거리 (Cosine Distance)

코사인 유사도와 대비되는 개념으로 코사인 거리가 있다. 이는 두 벡터가 얼마나 '다른지'를 측정하며, 다음과 같이 정의된다. $$\text{Cosine Distance} = 1 - \text{Cosine Similarity}$$ 유사도가 1(완전 일치)이면 거리는 0이 되며, 유사도가 0(직교)이면 거리는 1이 된다.

6.2 기타 유사도 측정법 비교

측정법 계산 방식 최적 활용 사례 특징
자카드 유사도 $\frac{A \cap B}{A \cup B}$ 집합 간의 중복도 측정 빈도가 아닌 '존재 여부'만 중요할 때
피어슨 상관계수 공분산을 표준편차의 곱으로 나눔 사용자 평점 데이터 분석 각 벡터에서 평균을 뺀 후(Centering) 코사인 유사도를 구하는 것과 동일함
맨해튼 거리 $\sum |A_i - B_i|$ 격자 형태의 경로 거리 측정 차원이 매우 높을 때 유클리드 거리보다 안정적

코사인 유사도는 특히 방향성이 중요한 고차원 데이터에서 강력한 성능을 발휘하며, 현대의 자연어 처리(NLP) 모델인 Word2Vec, BERT 등의 임베딩 벡터 유사도 측정의 표준으로 사용되고 있다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?